using Godot;
using System;
using Smr;

public partial class 组件进度条 : Control
{
    [Signal] public delegate void 信号动画结束EventHandler();
    [Export] private Color 前景色 = new(1f, 1f, 1f, 1);
    [Export] private Color 背景色 = new(0.6f, 0.6f, 0.6f, 1);
    [Export] private Color 边框色 = new(0, 0, 0, 1);
    [Export] private int 字体大小 = 16;
    [Export] private bool 播放动画 = true;
    [Export] private bool 显示百分比 = false;

    private float 最大值 = 100f;
    private float 当前值
    {
        get => _当前值;
        set
        {
            _当前值 = Mathf.Min(Mathf.Max(0, value), 最大值);
            前景.SetSize(new Vector2(背景.Size.X * 取当前值百分比(), 背景.Size.Y), true);
        }
    }

    private float _当前值 = 100f;
    private ColorRect 背景;
    private ColorRect 前景;
    private Label 当前值标签;
    private Label 分隔符标签;
    private Label 最大值标签;
    private Label 百分比标签;
    private bool 动画中 = false;

    public override void _Ready()
    {
        var 边框 = GetNode<ReferenceRect>("边框");
        边框.BorderColor = 边框色;
        背景 = GetNode<ColorRect>("背景");
        背景.Color = 背景色;
        前景 = GetNode<ColorRect>("前景");
        前景.Color = 前景色;
        当前值标签 = GetNode<Label>("数值显示/当前值");
        分隔符标签 = GetNode<Label>("数值显示/分隔符");
        最大值标签 = GetNode<Label>("数值显示/最大值");
        百分比标签 = GetNode<Label>("数值显示/百分比");
        当前值标签.AddThemeFontSizeOverride("font_size", 字体大小);
        分隔符标签.AddThemeFontSizeOverride("font_size", 字体大小);
        最大值标签.AddThemeFontSizeOverride("font_size", 字体大小);
        百分比标签.AddThemeFontSizeOverride("font_size", 字体大小);

        百分比标签.Visible = 显示百分比;
        if (百分比标签.Visible)
        {
            最大值标签.SizeFlagsHorizontal = SizeFlags.Fill;
        }
    }

    public void 置数值(float 值)
    {
        最大值 = 值;
        当前值 = 值;
        最大值标签.Text = ((int)最大值).ToString();
        当前值标签.Text = ((int)当前值).ToString();
    }

    public void 置当前值(float 值)
    {
        动画中 = true;
        当前值 = 值;

        if (播放动画)
        {
            Tween 补间动画 = CreateTween().BindNode(this);
            补间动画.SetParallel();
            补间动画.TweenProperty(前景, "size:x", 背景.Size.X * 取当前值百分比(), 0.25 * 配置.战斗加速[游戏存档.战斗加速])
            .SetTrans(Tween.TransitionType.Linear).SetEase(Tween.EaseType.Out);
            补间动画.TweenProperty(当前值标签, "text", ((int)当前值).ToString(), 0.25 * 配置.战斗加速[游戏存档.战斗加速]);
            补间动画.Finished += () =>
            {
                动画结束();
                补间动画 = null;
            };
        }
        else
        {
            当前值标签.Text = ((int)当前值).ToString();
            百分比标签.Text = $"({方法.四舍五入(取当前值百分比() * 100, 2)}%)";
            动画结束();
        }
    }

    public void 置最大值(float 值)
    {
        最大值 = 值;
        最大值标签.Text = ((int)最大值).ToString();
    }

    private float 取当前值百分比()
    {
        return Mathf.Min(Mathf.Max(0, (当前值 - 0) / (最大值 - 0)), 1);
    }

    private void 动画结束()
    {
        动画中 = false;
        EmitSignal(SignalName.信号动画结束);
    }
}
